package com.adun.springsecuritydemo.controller;

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author zhudunfeng
 * @date 2021/6/24 17:35
 *
 *
 *    @PreAuthorize
 *    表示访问方法或类在执行之前判断权限，大多数情况下都是使用这个注解，注解的参数和
 *    access()方法参数取值相同，都是权限表达式。
 *
 *    @PostAuthorize
 *    表示方法或类执行结束后判断权限，此注解很少被使用到。
 *
 *
 *
 */
@Controller
public class LoginController {

    /**
     * 登录 to 主页面
     * @return
     */
//    @RequestMapping("/login")
//    public String login(){
//        return "redirect:main.html";
//    }


    /**
     * to 主页面
     * @return
     */
    //这个注解是专门用于判断是否具有相关角色的，能写在方法或类上，参数要以ROLE_ 开头
    //角色名称严格区分大小写
    //如果设置的条件允许，程序正常执行，如果不允许，会报500
    //org.springframework.security.access.AccessDeniedException: 不允许访问
//    @Secured(value = "ROLE_abc")

    //PreAuthorize允许角色以ROLE_开头，也可以不以ROLE_开头，但配置类不允许以ROLE_开头，严格区分大小写，，，value是access表达式[去springSecurity官网查询]
    @PreAuthorize("hasRole('ROLE_abc')")
    @RequestMapping("/toMain")
    public String toMainPage(){
        return "redirect:main.html";
    }



    /**
     * to error page
     * @return
     */
    @RequestMapping("/toError")
    public String toErrorPage(){
        return "redirect:error.html";
    }

    @RequestMapping("/demo")
//    @ResponseBody
    public String demo(){
        return "demo";
    }

    @RequestMapping("/showLogin")
    public String showLogin(){
        return "login";
    }
}

